#include "stm32f4xx.h"                  // Device header
#include "stm32f4xx_conf.h"

uint8_t RS485_RxFlag;//RS485接收完成标志位

/*
 *函数简介:RS485初始化
 *参数说明:无
 *返回类型:无
 *备注:RS485的TTL输入默认选择UART2(USART1),默认Tx引脚PA9,Rx引脚PB7
 *备注:RS485默认波特率4M
 *备注:由于STM32波特率产生误差,需要配置3.8M才能稳定输出4M(具体误差不同芯片可能数据不同,需根据实际情况进行测试)
 */
void RS485_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//开启时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//复用推挽
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//默认上拉
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化UART2-Tx(PA9)
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
	GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化UART2-Rx(PB7)
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//开启PA9的USART1复用模式
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_USART1);//开启PB7的USART1复用模式
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate=3800000;//配置波特率4M
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//配置无硬件流控制
	USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;//配置为接发模式
	USART_InitStructure.USART_Parity=USART_Parity_No;//配置为无校验位
	USART_InitStructure.USART_StopBits=USART_StopBits_1;//配置停止位为1
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;//配置字长8bit
	USART_Init(USART1,&USART_InitStructure);//初始化USART1
		
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//打通USART1到NVIC的串口接收中断通道
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择NVIC分组2(2位抢占优先级，2位响应优先级)
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//选择USART1中断通道
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级为1
	NVIC_Init(&NVIC_InitStructure);//初始化USART1的NVIC
	
	USART_Cmd(USART1,ENABLE);//启动USART1
}

/*
 *函数简介:RS485发送一个字节
 *参数说明:8bits数据
 *返回类型:无
 *备注:RS485的TTL输入默认选择UART2(USART1)
 *备注:RS485默认波特率4M
 */
void RS485_SendByte(uint8_t Byte)
{
	USART_SendData(USART1,Byte);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成
}

/*
 *函数简介:RS485发送一个数组
 *参数说明:8bits数组
 *参数说明:数组长度
 *返回类型:无
 *备注:RS485的TTL输入默认选择UART2(USART1)
 *备注:RS485默认波特率4M
 */
void RS485_SendArray(uint8_t *Array,uint16_t Length)
{
	for(uint16_t i=0;i<Length;i++)
		RS485_SendByte(Array[i]);//依次发送数组的每一位
}

/*
 *函数简介:RS485接收中断(USART1串口中断函数)
 *参数说明:无
 *返回类型:无
 *备注:接收完成置RS485_RxFlag为1,需软件清0
 */
//**************************************************
//void USART1_IRQHandler(void)
//{
//	if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)//查询接收中断标志位
//	{
//		//UART2_RxData=USART_ReceiveData(USART1);//将数据存入缓存区
//		//函数体
//		RS485_RxFlag=1;//置接收完成标志位
//	}
//	
//	USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除接收中断标志位
//}
//**************************************************/
